package zx.lrn.notes.basic_grammer.about_collections;

import java.util.*;

/**
 *
 * @ClassName: OperationOfSet
 * @Description: 集合的交并补运算
 * 明确一下集合：集合是数学中的概念，指具有某种特定性质的具体的或抽象的对象汇总而成的集体。集合中的元素是唯一的。
 * 所以，JAVA集合框架中，实现了Set接口的为狭义的集合。
 * @Author: zhaoxuan
 * @Date: 2020/3/12 0:49
 **/
public class OperationOfSet {

    // 交集
    private static <T> Set<T> intersection(Set<T> coll1, Set<T> coll2) {
        // retainAll 将从coll1中删除所有未在coll2中出现的元素，即为交集运算
        coll1.retainAll(coll2);
        return coll1;
    }

    // 并集
    private static <T> Set<T> union(Set<T> coll1, Set<T> coll2) {
        // 因为是集合，所以addAll会去重，即实现了并集
        coll1.addAll(coll2);
        return coll1;
    }

    // 差集 A中有而B中没有
    private static <T> Set<T> difference(Set<T> coll1, Set<T> coll2) {
        // removeAll 将从coll1中删掉所有在coll2中出现的元素，即为差集运算
        coll1.removeAll(coll2);
        return coll1;
    }

    public static void main(String[] args) {
        List<String> listA = Arrays.asList("a","b","c","d","e","f");
        List<String> listB = Arrays.asList("x","y","z","d","e","f");
        Set<String> setLeftA = new HashSet<>(listA);
        Set<String> setLeftB = new HashSet<>(listA);
        Set<String> setLeftC = new HashSet<>(listA);
        Set<String> setRight = new HashSet<>(listB);
        System.out.println(intersection(setLeftA,setRight));
        System.out.println(union(setLeftB,setRight));
        System.out.println(difference(setLeftC,setRight));
    }
}
